package algorithm.sort;

import java.util.Arrays;

/**
 * @ClassName : data_structure.TestSort.InsertSort
 * @Description : 类描述
 * Created by cyd on 2021-02-21 21:52:58
 */
public class InsertSort {

    public int[] sort(int[] sourceArray) {
        // 对 arr 进行拷贝，不改变参数内容
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

        // 从下标为1的元素开始选择合适的位置插入，因为下标为0的只有一个元素，默认是有序的
        for (int i = 1; i < arr.length; i++) {

            // 记录要插入的数据
            int tmp = arr[i];

            // j是用于插入的指针
            int j = i;
            // 从已经排序的序列最右边的开始比较，找到比tmp大的数
            // 此循环为了把到i-1为止的每个数字，向后挪1位
            while (j > 0 && tmp < arr[j - 1]) {
                arr[j] = arr[j - 1];
                j--;
            }

            // 当(j != i)时，可以得知while循环触发了
            // 说明存在比tmp大的数，且此时j索引处就是应该插入的位置
            if (j != i) {
                arr[j] = tmp;
            }

        }
        return arr;
    }

    public static void main(String[] args) {
        int[] ints = {1, 3, 5, 7, 9, 2, 4, 6, 8, 0, -1};
        InsertSort insertSort = new InsertSort();
        int[] sort = insertSort.sort(ints);
        System.out.println(Arrays.toString(ints));
        System.out.println(Arrays.toString(sort));
    }
}
